home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 June: Reference Library / Dev.CD Jun 94.toast / Periodicals / develop / develop Issue 11 / develop 11 code / MultiBuffer / MultiBuffer Source / DoubleBuffer.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-07-15  |  3.6 KB  |  122 lines  |  [TEXT/MPS ]

  1. #ifndef __MAININCLUDES__
  2. #include "MainApp.h"
  3. #endif
  4.  
  5. #ifndef    __DOUBLEBUFFERINCLUDES__
  6. #define __DOUBLEBUFFERINCLUDES__
  7. #endif
  8.  
  9. enum {
  10.     kBufferSize = (5 * 1024),                                                // private, 2k buffersize
  11.     kNumBuffers = 4                                                            // number of buffers
  12. };
  13.  
  14. enum {                                                                        // buffer status values
  15.     kBufferReady = 0,
  16.     kBufferPlaying = 1,
  17.     kBufferFilling = 2,
  18.     kBufferProcessing = 3
  19. };
  20.  
  21. typedef struct {                                                            // Deferred task record
  22.     QElemPtr    qLink;
  23.     short        qType;
  24.     short        dtFlags;
  25.     ProcPtr        dtAddr;
  26.     long        dtParam;
  27.     long        dtReserved;
  28.  
  29. } DeferredTask, *DeferredTaskPtr;
  30.  
  31. typedef struct {
  32.     ParamBlockHeader
  33.     short            ioFRefNum;
  34.     long            filler1;
  35.     short            filler2;
  36.     Ptr                ioBuffer;
  37.     long            ioReqCount;
  38.     long            ioActCount;
  39.     short            ioPosMode;
  40.     long            ioPosOffset;
  41. } strippedDownReadPB, *strippedDownReadPBPtr;
  42.  
  43. typedef struct {                                                            // Extended paramblock
  44.     strippedDownReadPB    pb;
  45.     Ptr                    userInfo;
  46.     short                headerNum;
  47. } ExtParamBlockRec, *ExtParmBlkPtr;
  48.  
  49. typedef struct {                                                            // buffer record
  50.     short                flags;                                                //    buffer flags
  51.     ExtParamBlockRec    readPB;                                                //    pb for asynch reads
  52.     DeferredTask        dt;                                                    //      deffered task record
  53.     SoundHeaderPtr        header;                                                //    header to put data in
  54. } SampleBuffer, *SampleBufferPtr;
  55.  
  56. typedef struct {                                                            // Double Buffering Info
  57.     OSType                signature;                                            //   Info signature
  58.     unsigned long        refNum;                                                //     RefNum of device
  59.     unsigned long        fileDataStart;                                        //   where data starts in file
  60.     long                bytesToGo;                                            //     number of bytes to go
  61.     short                currentBuffer;                                        //   buffer playing now
  62.     SampleBuffer        buffers[kNumBuffers];                                //   data buffers
  63.     SndCommand            bCmd;                                                //   buffer cmd sndCmd
  64.     SndCommand            cbCmd;                                                //   callback cmd sndCmd
  65.     ProcPtr                processingProcPtr;                                    //   pointer to processing procedure
  66.     ProcPtr                readProcPtr;
  67.     long                oldUserInfo;                                        //   what userlong was.
  68.     long                a5ref;
  69. } PrivateDBInfo, *PrivateDBInfoPtr;
  70.  
  71. #define NextHeader(x) (x+1) < kNumBuffers ? x+1 : 0
  72.  
  73. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  74. // prototypes
  75.  
  76. PrivateDBInfoPtr         SetUpDBPrivateMem(void);
  77. void                     FreeDBPrivateMem (void *freeSpace);
  78. OSErr                     PrimeBuffers (PrivateDBInfoPtr dbInfo, SoundHeaderPtr generalHeader);
  79. pascal                     void DBService (SndChannelPtr chan,SndCommand* acmd);
  80. OSErr                     QueueFrame (SndChannelPtr chan, PrivateDBInfoPtr dbInfo);
  81. void                     CompleteRead (void);
  82. OSErr                     ReadProc (void *private, short bufNum, Boolean asynch);
  83. void                     ProcessingProc (void);
  84. void                    TwosToOffset(const Ptr buffer,long length);
  85. void                    Reverse(Ptr buffer, long length);
  86. void                     ReadWave (WaveCyclePtr theWave, unsigned short reqBytes, Ptr buffer);
  87. OSErr                     WaveReadProc (void *private, short bufNum, Boolean asynch);
  88.  
  89.  
  90.  
  91. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  92. // inlines
  93.  
  94.  
  95. pascal long getPB () = {
  96.             0x2e88                                                            //    MOVE.L A0,(A7)
  97. };
  98.  
  99. pascal long putPB (void* thePB) = {
  100.             0x205f                                                          //    MOVEA.L (SP)+, A0
  101. };
  102.  
  103. pascal short getErr () = {
  104.             0x3e80                                                            //    MOVE.W D0,(A7)
  105. };
  106.  
  107. pascal SampleBufferPtr getDTParam () = {
  108.             0x2e89                                                            //    MOVE.L A1,(A7)
  109. };
  110.  
  111. pascal void CallDTWithParam (ProcPtr routine, SampleBufferPtr arg) = {
  112.             0x225f,                                                         //    MOVEA.L (SP)+, A1
  113.             0x205f,                                                          //    MOVEA.L (SP)+, A0
  114.             0x4e90                                                            //    JSR (A0)
  115. };
  116.  
  117. pascal void QuickDTInstall (DeferredTaskPtr taskEl) = {
  118.             0x2278, 0x0d9c,                                                    //    MOVEA.L jDTInstall,A1
  119.             0x205f,                                                            //    MOVEA.L (SP)+, A0
  120.             0x4e91                                                            //    JSR (A1)
  121. };
  122.